#ifndef VISION_H
#define VISION_H
#include "Map.h"
/*! \class Vision
*    \brief Classe gérant la vision dans le niveau ou pointe m_
*/
class Vision
{
    public:

        Vision(Map* const m);
        virtual ~Vision();
        /*! \brief Methode qui calcule ce qui est visible par le personnage
         *  \param depart position à partir de la qu'elle on calcule la vision
         */
        void setVisibilite(position depart);
        /*! \brief La case x,y est elle visible
         * \param x position sur l'axe des abscisses
         *        y position sur l'axe des ordonnées
         */
        bool getVisibilite(int x,int y);
        /*! \brief Trace la ligne de bresenham entre le point depart et le point fin s'arrète si elle rencontre un objet non transparent
        *   ce qui reduit le temps de calcul de la vision sur la map entière par 4 !
        * \param depart depart de la ligne
        *        fin   fin de la ligne si elle rencontre aucun obstacle
        */
        const vector<position> bresenhamLine(position depart,position fin);
        /*! \brief Useless mais retourne les carés qui correspondent à l'approximation du cercle de centre centre et de rayon
        */
        vector<position> cercleVisible(position centre);
        /*! \brief Remet à zéro les cases visible
        */
        void resetVisible();
        /*! \brief Post process de la carte visible pour ajouter les murs derrière les case au sols éclairés ( cause de beaucoup d'artefact sans post process )
        */
        void postProcessVisible(position depart);
        /*! \brief Ecrit les lignes générér par bresenham dans la carte de booléen visible
            \param ligne VEcotr de position typiquement retour de bresenhalLine
        */
        void processBresenhamLine(vector<position> ligne);
        /*! \brief Active la vision globale
        */
        void changeVisionCheat();
    protected:
        bool visible_[NY][NX]; /*< Tableau de booléen décrivant la visibilité (true si visible) */
        int rangevisible_;  /*< Range de vision */
        bool visionCheat_;  /*< Vision globale activé ?*/
        Map* const m_;      /*< Pointeur vers la map */
    private:
};

#endif // VISION_H
